package br.ufcg.edu.algoritimo;

public class No<T extends Comparable<T>> implements Comparable<No<T>>{
	
	public enum COR { BRANCO, CINZA, PRETO }
	
	public static No<Long> NULO = new No<Long>(null, null, 0l, 0);
	private No<T> esquerda;
	private No<T> direita;
	private T valor;
	private int descricao;
	private boolean isFolha;
	private COR cor;
	
	public No(No<T> esquerda, No<T> direita, T valor,
			int descricao) {
		this.direita = direita;
		this.esquerda = esquerda;
		this.valor = valor;
		this.descricao = descricao;
		this.setCor(COR.BRANCO);
	}
	
	public No(No<T> esquerda, No<T> direita, T valor,
			int descricao, boolean isFolha) {
		this(esquerda,direita,valor,descricao);
		this.isFolha = isFolha;
	}
	
	

	public No<T> getEsquerda() {
		return esquerda;
	}
	public void setEsquerda(No<T> esquerda) {
		this.esquerda = esquerda;
	}
	public No<T> getDireita() {
		return direita;
	}
	public void setDireita(No<T> direita) {
		this.direita = direita;
	}
	public T getValor() {
		return valor;
	}
	public void setValor(T valor) {
		this.valor = valor;
	}

	public int getDescricao() {
		return descricao;
	}

	public void setDescricao(int descricao) {
		this.descricao = descricao;
	}

	@Override
	public int compareTo(No<T> no) {
		if (no == null) {
			return -1;
		}
		if (this.valor == null) {
			if (no.valor == null) {
				return 0;
			}
			return 11;
		}
		return valor.compareTo(no.valor);
	}

	public boolean isFolha() {
		return isFolha;
	}

	public void setFolha(boolean folha) {
		this.isFolha = folha;
	}

	public COR getCor() {
		return cor;
	}

	public void setCor(COR cor) {
		this.cor = cor;
	}

}
